package ch06
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;

	import utils.Ball;

	/**
	 * 反弹.
	 * 比如，我们手握一个橡胶球，然后松手使它落到地上，当小球落到地面时，会发生向上的反弹，但它永远不会回到我们的手中。
	 * 这是因为在反弹的过程中小球损失了一部分能量。损失的能量也许是制造声音了，也可能是制造热量了，地面或周围的空气也会吸收一部分能量。
	 * 重要一点是小球在发生反弹后运动的速度比之前要慢一些。换句话讲，它在反弹到某一轴上时，损失了速度矢量。
	 * 为了制造能量的损失，可以用弹性系数作为阻力.
	 *
	 * @author sjp
	 *
	 */
	public class Bouncing2 extends Sprite
	{
		private var ball:Ball;
		private var vx:Number;
		private var vy:Number;
		//弹性系数,为了制造能量的损失，可以用弹性系数作为阻力。
		private var bounce:Number=-0.7;
		private var gravity:Number=.5;

		public function Bouncing2()
		{
			init();
		}

		private function init():void
		{
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;

			ball=new Ball();
			ball.x=stage.stageWidth / 2;
			ball.y=stage.stageHeight / 2;
			vx=Math.random() * 10 - 5;
			vy=-10;
			addChild(ball);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void
		{
			vy+=gravity;
			ball.x+=vx;
			ball.y+=vy;
			var left:Number=0;
			var right:Number=stage.stageWidth;
			var top:Number=0;
			var bottom:Number=stage.stageHeight;

			if (ball.x + ball.radius > right)
			{
				ball.x=right - ball.radius;
				vx*=bounce;
			}
			else if (ball.x - ball.radius < left)
			{
				ball.x=left + ball.radius;
				vx*=bounce;
			}
			if (ball.y + ball.radius > bottom)
			{
				ball.y=bottom - ball.radius;
				vy*=bounce;
			}
			else if (ball.y - ball.radius < top)
			{
				ball.y=top + ball.radius;
				vy*=bounce;
			}
		}
	}
}
